#include "iostream"

using namespace std;

/*
 * 函数对象（仿函数）
    函数对象在使用时，可以像普通函数那样调用，可以有参数，可以有返回值
    函数对象超出普通函数的概念，函数对象可以有自己的状态
    函数对象可以作为参数传递

 */
//  函数对象在使用时，可以像普通函数那样调用，可以有参数，可以有返回值
class MyAdd {
public:
    int operator()(int v1, int v2) {
        return v1+v2;
    }
};

// 函数对象超出普通函数的概念，函数对象可以有自己的状态
class MyPrint {
public:
    int count;
    void operator()(const string &test) {
        cout << test << endl;
        this->count; // 调用自己的状态
    }
};


// 函数对象可以作为参数传递
void doPrint(MyPrint &mp, string test) {
    mp(test);
}

void test01() {
    MyAdd myAdd;
    int i = myAdd(10, 10);

    cout << i << endl;

    MyPrint myPrint;
    myPrint("hello world");
}


int main() {
    test01();
}